package boot

import (
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/frame/gins"
	"github.com/gogf/gf/net/ghttp"
	"reflect"
)

type Zeus struct {
	*ghttp.Server
	g *ghttp.RouterGroup

	//DB ORM
	db interface{}

	//多DB ORM  切换
	props []interface{}
}

//实例化
func Fighting() *Zeus {
	var g = &Zeus{Server: gins.Server()}
	return g
}

//中间件
func (this *Zeus) Attach(f Onion) *Zeus {
	this.Use(f.Process)
	return this
}

//控制器
func (this *Zeus) Action(group string, classes ...IClass) *Zeus {
	this.g = this.Group(group)
	for _, clazz := range classes {
		clazz.Route(this.g) // 遍历所有IController的具体实现， 并注册Route  这才是关键 !!!

		//TODO: 采用反射注入到控制器中
		vClass := reflect.ValueOf(clazz).Elem()

		//设置第一个字段为DB， 如果DB不是控制器的第一个内嵌字段，会报错！
		if vClass.NumField() > 0 {
			if this.db != nil {
				vClass.Field(0).Set(reflect.New(vClass.Field(0).Type().Elem()))
				vClass.Field(0).Elem().Set(reflect.ValueOf(this.db).Elem())
			}
		}

		//多字段设置
		/*for i := 0; i < vClass.NumField(); i++ {
			f := vClass.Field(i)
			if !f.IsNil() || f.Kind() != reflect.Ptr {
				continue
			}

			if p := this.DB(f.Type()); p != nil {
				f.Set(reflect.New(f.Type().Elem()))
				f.Elem().Set(reflect.ValueOf(p).Elem())
			}
		}*/

	}

	return this
}

//开始战斗吧 骚年 ！！！
func (this *Zeus) Start() {

	//配置文件初始化
	//this.Server.SetPort(8989)

	this.Server.Run()
}

//设置数据库链接对象
func (this *Zeus) DB(name ...string) *Zeus {
	this.db = g.DB(name...)
	//this.db = gins.Database(name...)
	return this
}
